package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.constant.OrderQueueMessageTypeEnum;
import com.ssy.lingxi.order.model.dto.OrderQueueDTO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 订单相关定时任务接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-10-21
 */
public interface IBaseOrderScheduleService {
    /**
     * 将延迟消息重新加入队列
     * @param queueDTO 消息实体
     * @return 是否需要（或已经）重新加入队列
     */
    Boolean reScheduleDelayMessage(OrderQueueDTO queueDTO);

    /**
     * 将延迟消息重新加入队列
     * @param messageTypeEnum 消息类型
     * @param jsonMessage     消息实体
     * @param millSeconds 延迟时间（毫秒）
     * @param times       重新入队列次数
     */
    void reScheduleDelayMessage(OrderQueueMessageTypeEnum messageTypeEnum, String jsonMessage, Integer millSeconds, Integer times);

    /**
     * 延迟队列 - 推送消息至延迟队列
     * @param messageType 消息类型
     * @param object 消息对象
     * @param millSeconds 延迟时间（毫秒）
     */
    void scheduleDelayMessage(OrderQueueMessageTypeEnum messageType, Object object, Long millSeconds);

    /**
     * （交易流程规则配置）订单自动取消 - 将订单推送至延迟队列
     * @param orders 订单列表
     */
    void scheduleOrderCancel(List<OrderDO> orders);

    /**
     * （交易流程规则配置）订单自动取消 - 将订单推送至延迟队列
     * @param orderId 订单Id
     * @param delayHours 延迟时间
     */
    void scheduleOrderCancel(Long orderId, BigDecimal delayHours);

    /**
     * 订单自动取消
     * @param jsonMessage 消息队列中的消息
     */
    void orderCancel(String jsonMessage);

    /**
     * 定时收货 - 将发货批次推送至消息队列
     * @param order   订单
     * @param batchNo 发货批次
     */
    void scheduleOrderDelivery(OrderDO order, Integer batchNo);

    /**
     * 定时收货 - 接收定时队列数据，发货
     * @param jsonMessage 从延迟队列中接收到的消息（订单Id和发货批次）
     */
    void scheduleOrderReceive(String jsonMessage);

    /**
     * 当调用营销服务接口返回拼团失败后，将拼团失败的订单重新加入Mq进行处理
     * @param orderId 拼团订单Id
     * @param groupId 拼团Id
     */
    void scheduleGroupOrder(Long orderId, Long groupId);

    /**
     * 拼团订单通知
     * @param jsonMessage 从消息队列中接收到的消息（订单Id和拼团状态）
     */
    void updateOrderGroupStatus(String jsonMessage);

    /**
     * 结算服务 - 更新订单支付记录结算状态
     * @param jsonMessage 从消息队列中接收到的消息（订单Id列表和结算状态）
     */
    void updateOrderPaymentStatus(String jsonMessage);

    /**
     * 延迟队列 - 接收到查询支付结果消息时，查询支付状态，并更新订单状态
     * @param times        加入队列的次数
     * @param jsonMessage 从消息队列中接收到的消息
     */
    void orderQueueCallback(Integer times, String jsonMessage);

    /**
     * 订单支付 - 回调通知队列
     * @param jsonMessage 从消息队列中接收到的消息
     */
    void orderPayCallback(String jsonMessage);

    /**
     * 订单发送赠品优惠券
     * @param jsonMessage
     */
    void sengCoupon(String jsonMessage);
}
